iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
JavaScript

Java程式實作系列 第 25

Java進階語法-2.2

  • 分享至 

  • xImage
  •  

#泛型介面(Generic Interface):
泛型介面允許我們定義一些通用的契約,並在實作時指定具體的型別:

java
interface Container {
void add(T item);
T get();
}

class Storage implements Container {
private T item;

@Override
public void add(T item) {
    this.item = item;
}

@Override
public T get() {
    return item;
}

}

public class Main {
public static void main(String[] args) {
Container stringStorage = new Storage<>();
stringStorage.add("Data");
System.out.println(stringStorage.get()); // 輸出: Data
}
}

在這個範例中,Container是一個泛型介面,Storage實作了這個介面,並在執行時指定具體型別。

#型別擦除(Type Erasure)機制
Java 的泛型在編譯期會進行型別檢查,以確保型別的安全性,但在運行期,Java 並不會保留具體的泛型型別資訊,這個過程稱為 型別擦除(Type Erasure)。

當 Java 編譯器編譯泛型程式碼時,它會將泛型型別替換為其上界(如果沒有明確指定,則替換為 Object),並插入適當的型別轉換操作。在運行期,所有的型別資訊都被擦除。這意味著在運行時,我們無法得知泛型的具體型別。

影響:

  1. 無法使用基本型別作為泛型參數:由於泛型的型別會被擦除,且所有泛型類型參數最終會被替換為 Object或其上界,因此你不能直接使用像 int、char等基本型別作為泛型參數。Java 提供了對應的包裝類(如 Integer、Character)來解決這個問題。
  2. 無法在運行期檢查泛型型別:由於型別擦除的存在,沒辦法在運行期得知泛型的具體型別。意味著你不能直接檢查或強制轉換泛型型別。例如,無法使用 instanceof來檢查具體的泛型類型。
  3. 無法創建泛型類型的實例:由於泛型的具體型別在運行時已被擦除,不能直接使用 new T()來創建泛型實例,通常的解決方案是通過傳遞類型參數來幫助創建實例。

#總結
泛型通過引入型別參數,使程式碼在編譯期具有型別安全性,同時提高程式的靈活性和可重用性。由於 Java 的型別擦除機制,在運行期無法得知具體的泛型型別,這可能會帶來某些限制,不過泛型的型別安全性指的是「編譯期的檢查」,而不是「運行時的型別辨別」。因此,透過正確地使用泛型類、泛型方法和泛型介面,可以大大提升 Java 程式的結構與設計品質。https://ithelp.ithome.com.tw/upload/images/20241009/20169489OoH3Up7JWl.png


上一篇
Java進階語法-2
下一篇
Java進階語法-3
系列文
Java程式實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言